/* Copyright (C) 2021 Rain */

/* This file is part of XNIX. */

/* 
  XNIX is free software: you can redistribute it and/or modify 
  it under the terms of the GNU General Public License as published by 
  the Free Software Foundation, either version 3 of the License, or 
  (at your option) and later version. 
*/

/*
  XNIX is distributed in the hope that it will be useful, 
  but WITHOUT ANY WARRANTY; without even the implied warranty of 
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 
  GNU General Public License for more details. 
*/

/*
  You should have received a copy of the GNU General Public License 
   along with XNIX. If not, see <https://www.gnu.org/licenses/>.  
*/




#ifndef _FIFO_H
#define _FIFO_H

typedef __uint64_t __fifo_buf_t;

struct fifo {
	volatile __fifo_buf_t *buf;
	int total;
	volatile int next_wr, next_rd;

	/* how many we should (can) read */
	volatile int need_read;
};


void fifo_init(struct fifo *, __fifo_buf_t *, int);
__fifo_buf_t fifo_get(struct fifo *);
void fifo_put(struct fifo *, __fifo_buf_t);


#endif

